package com.hongyi.websocket.holder;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.web.socket.WebSocketSession;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * WebSocketSession 用于保存当前所有在线的会话信息
 *
 * @author DingHao
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class WebSocketSessionHolder {

    //USER_SESSION_MAP是一个静态的、不可变的ConcurrentHashMap，用来存储用户ID（Long类型）到WebSocketSession对象的映射
    private static final Map<Long, WebSocketSession> USER_SESSION_MAP = new ConcurrentHashMap<>();

    /**
     * 添加session
     *
     * <p>在WebSocket连接成功建立后，将用户的会话信息保存下来，以便后续可以查找和使用</p>
     * @param sessionKey sessionKey
     * @param session    session
     */
    public static void addSession(Long sessionKey, WebSocketSession session) {
        //接收一个用户ID (sessionKey) 和一个WebSocketSession对象，并将它们添加到USER_SESSION_MAP中
        USER_SESSION_MAP.put(sessionKey, session);
    }

    /**
     * 移除session
     *
     * <p>在WebSocket连接关闭后，将用户的会话信息从USER_SESSION_MAP中移除</p>
     * @param sessionKey sessionKey
     */
    public static void removeSession(Long sessionKey) {
        if (USER_SESSION_MAP.containsKey(sessionKey)) {
            USER_SESSION_MAP.remove(sessionKey);
        }
    }

    /**
     * 获取session
     *
     * <p>根据用户ID（sessionKey）获取对应的WebSocketSession对象</p>
     * @param sessionKey sessionKey
     * @return WebSocketSession
     */
    public static WebSocketSession getSessions(Long sessionKey) {
        return USER_SESSION_MAP.get(sessionKey);
    }

    /**
     * 获取所有session
     *
     * <p>获取所有用户的会话信息</p>
     * @return Set<Long>
     */
    public static Set<Long> getSessionsAll() {
        return USER_SESSION_MAP.keySet();
    }

    /**
     * 判断是否存在session
     *
     * <p>判断是否存在用户的会话信息</p>
     * @param sessionKey sessionKey
     * @return Boolean
     */
    public static Boolean existSession(Long sessionKey) {
        return USER_SESSION_MAP.containsKey(sessionKey);
    }
}
